<?php

namespace App\Http\Controllers\OperationManagement;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\OperationManagement\JobScope;
use Illuminate\Database\QueryException;
use App\Http\Requests\OperationManagement\JobScopeRequest;
use Grimzy\LaravelMysqlSpatial\Types\Polygon;

/**
 * @group 基础信息管理->环卫->道路、区域基础信息管理
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */

class JobScopeController extends Controller
{
    /**
     * 道路信息查看列表
     * @bodyParam road_name string 道路名称
     * @bodyParam road_level integer 养护等级 1一级路段 2二级路段 3三级路段
     * @bodyParam areas polygon 道路区域(81 23,20 35,75 21,77 23,81 23)
     *
     * @queryParam number string 道路编号
     * @queryParam road_name string 道路名称
     * @queryParam road_level integer 养护等级 0一级 1二级 2三级
     * @queryParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @queryParam area_id integer 城市id 外键 城市信息表
     * @queryParam area->name string 区域名称
     * @queryParam area->city->name string 城市名称
     * @queryParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @queryParam road_origin string 起点
     * @queryParam road_destination string 终点
     * @queryParam areas polygon 道路区域
     * @queryParam road_length  string  道路长度
     * @queryParam road_width   string 道路宽度
     * @queryParam motor_length string  机动车道长度
     * @queryParam motor_width string  机动车道宽度
     * @queryParam non-motor_length string 非机动车道长度
     * @queryParam non-motor_width string 非机动车道宽度
     * @queryParam sidewalk_length string 人行道长度
     * @queryParam sidewalk_width string 人行车道宽度
     * @queryParam other_width string 其他道长度
     * @queryParam other_length string 其他道宽度
     * @queryParam road_areas string 作业面积
     * @queryParam length_unit string 长度单位
     * @queryParam area_unit string  面积单位
     * @queryParam mode string 清扫模式
     * @queryParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @queryParam details text 设施详情 json数据
     * @queryParam remake string 备注
     * @queryParam parent_id integer 父级id
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $jobScope = new JobScope;
        $data = $jobScope->getList($request);
        return response()->json(encodeMsg($data,200));
    }

    /**
     * 道路信息查看顶级列表
     *
     * @bodyParam number string 道路编号
     * @bodyParam road_name string 道路名称
     * @bodyParam type integer 幅路类型 0一幅路 1二幅路 2四幅路
     *
     * @queryParam number string 道路编号
     * @queryParam road_name string 道路名称
     * @queryParam road_level integer 养护等级 0一级 1二级 2三级
     * @queryParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @queryParam area_id integer 城市id 外键 城市信息表
     * @queryParam area->name string 区域名称
     * @queryParam area->city->name string 城市名称
     * @queryParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @queryParam road_origin string 起点
     * @queryParam road_destination string 终点
     * @queryParam areas polygon 道路区域
     * @queryParam road_length  string  道路长度
     * @queryParam road_width   string 道路宽度
     * @queryParam motor_length string  机动车道长度
     * @queryParam motor_width string  机动车道宽度
     * @queryParam non-motor_length string 非机动车道长度
     * @queryParam non-motor_width string 非机动车道宽度
     * @queryParam sidewalk_length string 人行道长度
     * @queryParam sidewalk_width string 人行车道宽度
     * @queryParam other_width string 其他道长度
     * @queryParam other_length string 其他道宽度
     * @queryParam road_areas string 作业面积
     * @queryParam length_unit string 长度单位
     * @queryParam area_unit string  面积单位
     * @queryParam mode string 清扫模式
     * @queryParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @queryParam details text 设施详情 json数据
     * @queryParam remake string 备注
     * @queryParam parent_id integer 父级id
     *
     * @return \Illuminate\Http\Response
     */
    public function getParentList(Request $request)
    {
        $jobScope = new JobScope;
        $data = $jobScope->getParentList($request);
        return response()->json(encodeMsg($data,200));
    }

    /**
     * 道路信息查看分段路段列表
     *
     * @bodyParam parent_id integer required 父级id
     * @bodyParam number string 道路编号
     * @bodyParam road_name string 道路名称
     * @bodyParam type integer 幅路类型 0一幅路 1二幅路 2四幅路
     *
     * @queryParam number string 道路编号
     * @queryParam road_name string 道路名称
     * @queryParam road_level integer 养护等级 0一级 1二级 2三级
     * @queryParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @queryParam area_id integer 城市id 外键 城市信息表
     * @queryParam area->name string 区域名称
     * @queryParam area->city->name string 城市名称
     * @queryParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @queryParam road_origin string 起点
     * @queryParam road_destination string 终点
     * @queryParam areas polygon 道路区域
     * @queryParam road_length  string  道路长度
     * @queryParam road_width   string 道路宽度
     * @queryParam motor_length string  机动车道长度
     * @queryParam motor_width string  机动车道宽度
     * @queryParam non-motor_length string 非机动车道长度
     * @queryParam non-motor_width string 非机动车道宽度
     * @queryParam sidewalk_length string 人行道长度
     * @queryParam sidewalk_width string 人行车道宽度
     * @queryParam other_width string 其他道长度
     * @queryParam other_length string 其他道宽度
     * @queryParam road_areas string 作业面积
     * @queryParam length_unit string 长度单位
     * @queryParam area_unit string  面积单位
     * @queryParam mode string 清扫模式
     * @queryParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @queryParam details text 设施详情 json数据
     * @queryParam remake string 备注
     * @queryParam parent_id integer 父级id
     *
     * @return \Illuminate\Http\Response
     */
    public function getSonList(Request $request)
    {
        $jobScope = new JobScope;
        $data = $jobScope->getSonList($request);
        return response()->json(encodeMsg($data,200));
    }


    /**
     * 添加道路信息
     *
     * @bodyParam number string 道路编号
     * @bodyParam road_name string 道路名称
     * @bodyParam road_level integer 养护等级 0一级 1二级 2三级
     * @bodyParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @bodyParam area_id integer 城市id 外键 城市信息表
     * @bodyParam area->name string 区域名称
     * @bodyParam area->city->name string 城市名称
     * @bodyParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @bodyParam road_origin string 起点
     * @bodyParam road_destination string 终点
     * @bodyParam areas polygon 道路区域
     * @bodyParam road_length  string  道路长度
     * @bodyParam road_width   string 道路宽度
     * @bodyParam motor_length string  机动车道长度
     * @bodyParam motor_width string  机动车道宽度
     * @bodyParam non-motor_length string 非机动车道长度
     * @bodyParam non-motor_width string 非机动车道宽度
     * @bodyParam sidewalk_length string 人行道长度
     * @bodyParam sidewalk_width string 人行车道宽度
     * @bodyParam other_width string 其他道长度
     * @bodyParam other_length string 其他道宽度
     * @bodyParam road_areas string 作业面积
     * @bodyParam length_unit string 长度单位
     * @bodyParam area_unit string  面积单位
     * @bodyParam mode string 清扫模式
     * @bodyParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @bodyParam details text 设施详情 json数据
     * @bodyParam remake string 备注
     * @bodyParam parent_id integer 父级id
     *
     * @queryParam number string 道路编号
     * @queryParam road_name string 道路名称
     * @queryParam road_level integer 养护等级 0一级 1二级 2三级
     * @queryParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @queryParam area_id integer 城市id 外键 城市信息表
     * @queryParam area->name string 区域名称
     * @queryParam area->city->name string 城市名称
     * @queryParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @queryParam road_origin string 起点
     * @queryParam road_destination string 终点
     * @queryParam areas polygon 道路区域
     * @queryParam road_length  string  道路长度
     * @queryParam road_width   string 道路宽度
     * @queryParam motor_length string  机动车道长度
     * @queryParam motor_width string  机动车道宽度
     * @queryParam non-motor_length string 非机动车道长度
     * @queryParam non-motor_width string 非机动车道宽度
     * @queryParam sidewalk_length string 人行道长度
     * @queryParam sidewalk_width string 人行车道宽度
     * @queryParam other_width string 其他道长度
     * @queryParam other_length string 其他道宽度
     * @queryParam road_areas string 作业面积
     * @queryParam length_unit string 长度单位
     * @queryParam area_unit string  面积单位
     * @queryParam mode string 清扫模式
     * @queryParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @queryParam details text 设施详情 json数据
     * @queryParam remake string 备注
     * @queryParam parent_id integer 父级id
     *
     * @return \Illuminate\Http\Response
     */
    public function store(JobScopeRequest $request)
    {
        try {
            $data = $request->all();
            $areas = $request->input('areas','');
            if(!empty($data['parent_id'])){
                $count = JobScope::where('parent_id',$data['parent_id'])->count();
                $data['number'] = $data['parent_id'] . '-' . ($count + 1);
            }else{
                $count = JobScope::whereNull('parent_id')->count();
                $data['number'] = $count + 1;
            }
            if(!empty($areas)){
                $data['areas'] = Polygon::fromString($areas);
            }
            JobScope::create($data);
            return response()->json(encodeMsg($data,201));
        } catch (QueryException $e) {
            dd($e);
            return response()->json(encodeMsg(['message' => '道路信息添加失败!'],400));
        }
    }

    /**
     * 查看道路信息
     *
     * @bodyParam id int required  道路信息ID
     *
     * @queryParam number string 道路编号
     * @queryParam road_name string 道路名称
     * @queryParam road_level integer 养护等级 0一级 1二级 2三级
     * @queryParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @queryParam area_id integer 城市id 外键 城市信息表
     * @queryParam area->name string 区域名称
     * @queryParam area->city->name string 城市名称
     * @queryParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @queryParam road_origin string 起点
     * @queryParam road_destination string 终点
     * @queryParam areas polygon 道路区域
     * @queryParam road_length  string  道路长度
     * @queryParam road_width   string 道路宽度
     * @queryParam motor_length string  机动车道长度
     * @queryParam motor_width string  机动车道宽度
     * @queryParam non-motor_length string 非机动车道长度
     * @queryParam non-motor_width string 非机动车道宽度
     * @queryParam sidewalk_length string 人行道长度
     * @queryParam sidewalk_width string 人行车道宽度
     * @queryParam other_width string 其他道长度
     * @queryParam other_length string 其他道宽度
     * @queryParam road_areas string 作业面积
     * @queryParam length_unit string 长度单位
     * @queryParam area_unit string  面积单位
     * @queryParam mode string 清扫模式
     * @queryParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @queryParam details text 设施详情 json数据
     * @queryParam remake string 备注
     * @queryParam parent_id integer 父级id
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $data = JobScope::find($id);
        if($data == []) {
            return response()->json(encodeMsg(["message" => "没有该道路信息!"], 404));
        } else {
            return response()->json(encodeMsg($data,200));
        }
    }

    /**
     * 修改道路信息
     *
     * @bodyParam number string 道路编号
     * @bodyParam road_name string 道路名称
     * @bodyParam road_level integer 养护等级 0一级 1二级 2三级
     * @bodyParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @bodyParam area_id integer 城市id 外键 城市信息表
     * @bodyParam area->name string 区域名称
     * @bodyParam area->city->name string 城市名称
     * @bodyParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @bodyParam road_origin string 起点
     * @bodyParam road_destination string 终点
     * @bodyParam areas polygon 道路区域
     * @bodyParam road_length  string  道路长度
     * @bodyParam road_width   string 道路宽度
     * @bodyParam motor_length string  机动车道长度
     * @bodyParam motor_width string  机动车道宽度
     * @bodyParam non-motor_length string 非机动车道长度
     * @bodyParam non-motor_width string 非机动车道宽度
     * @bodyParam sidewalk_length string 人行道长度
     * @bodyParam sidewalk_width string 人行车道宽度
     * @bodyParam other_width string 其他道长度
     * @bodyParam other_length string 其他道宽度
     * @bodyParam road_areas string 作业面积
     * @bodyParam length_unit string 长度单位
     * @bodyParam area_unit string  面积单位
     * @bodyParam mode string 清扫模式
     * @bodyParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @bodyParam details text 设施详情 json数据
     * @bodyParam remake string 备注
     * @bodyParam parent_id integer 父级id
     *
     * @queryParam number string 道路编号
     * @queryParam road_name string 道路名称
     * @queryParam road_level integer 养护等级 0一级 1二级 2三级
     * @queryParam type integer 幅路类型  0一幅路 1二幅路 2三幅路 3四幅路
     * @queryParam area_id integer 城市id 外键 城市信息表
     * @queryParam area->name string 区域名称
     * @queryParam area->city->name string 城市名称
     * @queryParam category integer 道路类型 0道路 1天桥 2高架道路 3步行街
     * @queryParam road_origin string 起点
     * @queryParam road_destination string 终点
     * @queryParam areas polygon 道路区域
     * @queryParam road_length  string  道路长度
     * @queryParam road_width   string 道路宽度
     * @queryParam motor_length string  机动车道长度
     * @queryParam motor_width string  机动车道宽度
     * @queryParam non-motor_length string 非机动车道长度
     * @queryParam non-motor_width string 非机动车道宽度
     * @queryParam sidewalk_length string 人行道长度
     * @queryParam sidewalk_width string 人行车道宽度
     * @queryParam other_width string 其他道长度
     * @queryParam other_length string 其他道宽度
     * @queryParam road_areas string 作业面积
     * @queryParam length_unit string 长度单位
     * @queryParam area_unit string  面积单位
     * @queryParam mode string 清扫模式
     * @queryParam facilities string 分割设施 1=绿化带 2=防护栏 3=分割线 1,2
     * @queryParam details text 设施详情 json数据
     * @queryParam remake string 备注
     * @queryParam parent_id integer 父级id
     *
     * @return \Illuminate\Http\Response
     */
    public function update(JobScopeRequest $request, $id)
    {
        $jobScope = JobScope::find($id);
        if($jobScope == []) {
            return response()->json(encodeMsg(["message" => "没有该道路信息!"], 404));
        }
        try {
            $data = $request->all();
            $areas = $request->input('areas','');
            if(!empty($data['parent_id'])){
                $count = JobScope::where('parent_id',$data['parent_id'])->count();
                $data['number'] = $data['parent_id'] . '-' . ($count + 1);
            }else{
                $count = JobScope::whereNull('parent_id')->count();
                $data['number'] = $count + 1;
            }
            if(!empty($areas)){
                $data['areas'] = Polygon::fromString($areas);
            }
            $jobScope->update($data);
            return response()->json(encodeMsg($jobScope,200));
        } catch (QueryException $e) {
            return response()->json(encodeMsg(['message' => '道路信息修改失败!'],400));
        }
    }

    /**
     * 删除道路信息
     *
     *
     * @bodyParam id int required  道路信息ID
     * @response 204 {
     *   "message": "道路信息删除成功"
     * }
     *
     *
     * @response 404 {
     *  "message": "没有该道路信息"
     * }
     *
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $jobScope = JobScope::find($id);
        if($jobScope == []) {
            return response()->json(encodeMsg(["message" => "没有该作业范围信息!"], 404));
        }
        if($jobScope->delete()) {
            return response()->json(encodeMsg(["message" => "作业范围删除成功!"], 204));
        } else {
            return response()->json(encodeMsg(["message" => "作业范围删除失败"], 400));
        }
    }

    /**
     * 批量删除道路信息
     *
     * @bodyParam  ids int required  id集合字符串[格式：ids=1,2,3]
     * @response 204 {
     *   "message": "道路信息删除成功"
     * }
     *
     *
     */
    public function delete($ids)
    {
    	$listId = explode(',', $ids);
        JobScope::whereIn('id',$listId)->delete();
        return response()->json(encodeMsg(["message" => "作业范围删除成功!"], 204));
    }
}
